package com.xtm.exercise.base.A12threadDemo;

import java.math.BigDecimal;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;

/**
 * 详解java并发原子类AtomicInteger（基于jdk1.8源码分析）
 * atomic是线程不安全的。
 *   意思就是： 如果多个线程调用了getter或者setter，那么这些getter和setter的调用时线性的， 保证了同一时间只有一个函数(setter和getter)在调用， 但是并不能避免这个属性所对应的成员变量是线程安全的。
 *
 * Atomic包中的类基本的特性就是在多线程环境下，当有多个线程同时对单个（包括基本类型及引用类型）变量进行操作时，具有排他性，即当多个线程同时对该变量的值进行更新时，仅有一个线程能成功，而未成功的线程可以向自旋锁一样，继续尝试，一直等到执行成功。
 *
 * Atomic系列的类中的核心方法都会调用unsafe类中的几个本地方法。我们需要先知道一个东西就是Unsafe类，全名为：sun.misc.Unsafe，这个类包含了大量的对C代码的操作，包括很多直接内存分配以及原子操作的调用，而它之所以标记为非安全的，是告诉你这个里面大量的方法调用都会存在安全隐患，需要小心使用，否则会导致严重的后果，例如在通过unsafe分配内存的时候，如果自己指定某些区域可能会导致一些类似C++一样的指针越界到其他进程的问题。
 *
 */
public class Z09AtomicInteger {

    public static void main(String[] args) {
        AtomicInteger success = new AtomicInteger(0);
        success.incrementAndGet();

        AtomicReference<BigDecimal> totalSpendPrice = new AtomicReference<>(BigDecimal.ZERO);

        AtomicReference<String> str = new AtomicReference<>();

        /**
         * AtomicBoolean 内部持有了一个 volatile变量修饰的value，
         * 底层通过对象在内存中的偏移量(valueOffset)对应的旧值与当前值进行比较，
         * 相等则更新并返回true；否则返回false。
         *
         * 即CAS的交换思想.
         * AtomicBoolean 内部可以保证，在高并发情况下，同一时刻只有一个线程对变量修改成功。
         */
        AtomicBoolean bool = new AtomicBoolean(false);
    }
}
